package com.example.permissionservice.service;

import com.example.permissionservice.dao.ResourceMapper;
import com.example.permissionservice.servletComponent.MyFilter;
import com.myprojects.common.dto.Msg;
import com.myprojects.common.pojo.Resource;
import com.myprojects.common.pojo.ResourceParent;
import com.myprojects.common.pojo.UserWithRole;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.*;

import java.util.*;

@Service
public class PermissionService {

    private static final Logger logger = LoggerFactory.getLogger(PermissionService.class);

    @Autowired
    UserWithRoleService userWithRoleService;

    @Autowired
    UserTokenService userTokenService;

//    /**
//     * 通过权限信息生成父权限信息
//     * @param resourceList 子权限信息，不能为空，否则会出错!
//     */
//    public List<ResourceParent> getResourceParentByResource(List<Resource> resourceList){
//
//        Map<String, ResourceParent> resourceParentMap = new LinkedHashMap<>();
//        List<ResourceParent> resourceParentList = new ArrayList<>();
//        try {
//            //遍历所有该资源并生成父级标题ResourceParentList
//            for (Resource resource : resourceList) {
//                String parentStr = resource.getResource_name_parent();
//                ResourceParent parent = resourceParentMap.get(parentStr);
//                //如果该资源父标题还不存在于resourceParentMap中，说明其不存在，则需要创建ResourceParent
//                if (parent == null) {
//                    parent = new ResourceParent();
//                    parent.setTitle(parentStr);
//                    parent.addResource(resource);
//                    resourceParentMap.put(parentStr, parent);
//                    resourceParentList.add(parent);
//                } else {//否则其存在，直接调用添加方法
//                    parent.addResource(resource);
//                }
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return resourceParentList;
//    }

    /**
     * 同时获取用户信息和所拥有的权限信息，若用户不存在，则返回null
     *
     * @param token 在前端存储的用户token
     */
    public UserWithRole getUserByUserToken(String token){
        HashMap<String, UserWithRole> hashMap = userTokenService.searchUserByString(token+"*");
        UserWithRole user = null;
        if (hashMap.size() > 0){
            // 遍历map中的值
            for (UserWithRole value : hashMap.values()) {
                user = userWithRoleService.selectByPrimaryKey(value.getId());
                break;
            }
        }
        return user;
    }

    /**
     * 该方法用于通过用户请求和token来检查用户拥有的所有资源(权限)
     *
     * @param accessToken 用户的请求token
     * @param requestURI 用户的请求URI
     * @return 返回 boolean 值 true为允许通过，false为禁止通过
     */
    public boolean checkUserRequest(String accessToken, String requestURI) {



        //获取全部用户信息和权限
        UserWithRole user = this.getUserByUserToken(accessToken);

        if (user != null){
            List<Resource> resourceList = user.getResourceList();
            for (Resource resource : resourceList){
//                System.out.println("resource:"+resource+"\nrequestURI:"+requestURI);
                //若请求URI中包含权限认证名，则说明拥有该权限
                if (requestURI.contains(resource.getAuth_string())){
                    logger.info("需要检查的请求URI为{}，用户token为:{}，是否允许通过:{}，匹配的权限字符串为:{}", requestURI, accessToken, true, resource.getAuth_string());
                    return true;
                }
            }
        }
        //遍历完成后发现仍没有权限，则禁止通过
        logger.info("需要检查的请求URI为{}，用户token为:{}，是否允许通过:{}", requestURI, accessToken, false);
        return false;
    }

}
